package br.JZSolution.domineduplex

class UsuarioService {

    private static final String ERRO_NAO_CADASTRADO = "O usuário não existe na base de dados."
	private static final String ERRO_SENHA_INCORRETA = "A senha não correnponde ao usuário."
	private static final String ERRO_CADASTRAR_USUARIO = "Ocorreu um erro ao cadastrar o usuario."
	private static final String CABECALHO_MENSAGEM = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> \n"
	private static final String CADASTRO_SUCESSO = "Usuário cadastrado com sucesso."
	private static final String CADASTRO_CONTATO_SUCESSO = "Contato adicionado com sucesso."
	private static final String ERRO_CADASTRO_CONTATO = "Erro ao adicionar contato."
	private static final String SUCESSO_REMOVER_CONTATO = "Contato removido com sucesso da lista de amigos."
	private static final String ERRO_REMOVER_CONTATO = "Erro ao remover o contato da lista de amigos." 
	private static final String SUCESSO_AUTENTICAR = "Autenticado com sucesso."

	private static final int SUCESSO = 0
	private static final int ERRO = 1
	private static final int INFO = 2

	public String cadastrar(Usuario usuario){
		StringBuffer xml = new StringBuffer(CABECALHO_MENSAGEM)
		StringBuffer mensagens = new StringBuffer()
		xml.append("<domine>\n")
		try{
            usuario.save(failOnError:true)
			mensagens.append("\t<mensagem tipo=\""+SUCESSO+"\" >"+CADASTRO_SUCESSO+"</mensagem>\n")
		}catch (Exception e) {
			e.printStackTrace()
			mensagens.append("\t<mensagem tipo=\""+ERRO+"\" >"+ERRO_CADASTRAR_USUARIO+"</mensagem>\n")
		}

		xml.append("<mensagem>\n")
		xml.append(mensagens)
		xml.append("</mensagem>\n")
		xml.append("</domine>")

		return xml.toString()
	}

    public String autenticar(Usuario usuario){
		String erro = null

		StringBuffer xml = new StringBuffer()
		xml.append(CABECALHO_MENSAGEM)
		xml.append("<domine>\n")
		xml.append("<contatos>\n")
        
        def usuarioBD = Usuario.findByEmailAndSenha(usuario.email, usuario.senha)
		if(usuarioBD){

            usuarioBD.online = true
            usuarioBD.ip = usuario.ip
            usuarioBD.porta = usuario.porta

            //Cria a lista de contatos
            usuarioBD.listaDeContatos.each{ contato->
                xml.append(usuarioToXML(contato))
            }

		}else{
			erro= ERRO_NAO_CADASTRADO
		}

		xml.append("</contatos>\n")

		xml.append("<mensagens>\n")
		if(erro != null){
			xml.append("\t<mensagem tipo=\""+ERRO+"\" >"+erro+"</mensagem>\n")
		}else{
			xml.append("\t<mensagem tipo=\""+SUCESSO+"\" >"+SUCESSO_AUTENTICAR +"</mensagem>\n")
		}
		xml.append("</mensagens>\n")

		xml.append("</domine>\n")

		return xml.toString()
	}


	public String adicionarContato(String emailUsuario,String emailContato){
		StringBuffer xml = new StringBuffer(CABECALHO_MENSAGEM)
		xml.append("<domine>\n")
		StringBuffer mensagens = new StringBuffer()
		try{

            Usuario usuario = Usuario.findByEmail(emailUsuario)
            Usuario contato = Usuario.findByEmail(emailContato)

            println "usuario = "+usuario
            println "emailUsuario = "+emailUsuario

            println "contato = "+contato
            println "emailContato = "+emailContato

			if(!usuario.listaDeContatos.find{it.email==contato.email}){
				usuario.listaDeContatos << contato
			}else{
				mensagens.append("\t<mensagem tipo=\""+ERRO+"\">"+"Este contato ja foi adicionado a sua lista de amigos."+"</mensagem>\n")
			}

			xml.append("<contatos>\n"+ usuarioToXML(contato) + "</contatos>\n")
			mensagens.append("\t<mensagem tipo=\""+SUCESSO+"\">"+CADASTRO_CONTATO_SUCESSO+"</mensagem>\n")
		}catch (Exception e) {
            e.printStackTrace()
			mensagens.append("\t<mensagem tipo=\""+ERRO+"\">"+ERRO_CADASTRO_CONTATO+"</mensagem>\n")
		}

		xml.append("<mensagens>\n")
		xml.append(mensagens)
		xml.append("</mensagens>\n")
		xml.append("</domine>")

		return xml.toString()
	}

	public String removerContato(String emailUsuario,String emailContato){
		StringBuffer xml = new StringBuffer(CABECALHO_MENSAGEM)
		StringBuffer mensagens = new StringBuffer()
		xml.append("<domine>\n")

		try{
			Usuario usuario = Usuario.findByEmail(emailUsuario)
			Usuario contato = usuario.listaDeContatos.find{it.email==emailContato}

            if(contato){
                usuario.listaDeContatos.remove(contato)
            }

			mensagens.append("\t<mensagem tipo=\""+SUCESSO+"\">"+SUCESSO_REMOVER_CONTATO+"</mensagem>\n")
		}catch (Exception e) {
			e.printStackTrace()
			mensagens.append("\t<mensagem tipo=\""+ERRO+"\">"+ERRO_REMOVER_CONTATO+"<mensagem>\n")
		}

		xml.append("<mensagens>\n")
		xml.append(mensagens)
		xml.append("<mensagens>\n")
		xml.append("<domine>\n")
        
		return xml.toString()
	}

    

	public String logoff(Usuario usuario) {
		
        Usuario userBD = Usuario.findByEmailAndSenha(usuario.email, usuario.getSenha())
		if(userBD){
            userBD.setOnline(false)
		}

		return "ok"
	}

	private String usuarioToXML(Usuario usuario){
		StringBuffer xml = new StringBuffer()
		xml.append("\t<contato>\n")
		xml.append("\t\t<nome>\n")
		xml.append("\t\t\t"+usuario.nome+"\n")
		xml.append("\t\t</nome>\n")
		xml.append("\t\t<ip>\n")
		xml.append("\t\t\t"+usuario.ip+"\n")
		xml.append("\t\t</ip>\n")
		xml.append("\t\t<online>\n")
		xml.append("\t\t\t"+usuario.online+"\n")
		xml.append("\t\t</online>\n")
		xml.append("\t\t<porta>\n")
		xml.append("\t\t\t"+usuario.porta+"\n")
		xml.append("\t\t</porta>\n")
		xml.append("\t\t<email>\n")
		xml.append("\t\t\t"+usuario.email+"\n")
		xml.append("\t\t</email>\n")
		xml.append("\t</contato>\n")
		return xml.toString()
	}
}

